package com.li.o2oSystem.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.li.o2oSystem.cache.JedisUtil;
import com.li.o2oSystem.dao.HeadLineDao;
import com.li.o2oSystem.entity.HeadLine;
import com.li.o2oSystem.exceptions.HeadLineOperationException;
import com.li.o2oSystem.service.HeadLineService;
@Service
public class HeadLineServiceImpl implements HeadLineService{
	@Autowired
	private HeadLineDao headLineDao;
	@Autowired
	private JedisUtil.Keys jedisKeys;
	@Autowired
	private JedisUtil.Strings jedisStrings;
	
	private static Logger logger = LoggerFactory.getLogger(HeadLineServiceImpl.class);
	/**
	 * 根据条件返回查询的头条列表
	 */
	@Transactional
	public List<HeadLine> getHeadLineList(HeadLine headLineCondition) throws IOException {
		//定义redis的key前缀
		String key = HLLISTKEY;
		//定义接收对象
		List<HeadLine> headLineList = null;
		//定义jackson数据装换类
		ObjectMapper mapper = new ObjectMapper();
		//拼接出redis的key;拼接出头条的状态分别根据存储状态存储在不同的key中
		if(headLineCondition != null && headLineCondition.getEnableStatus() != null){
			key = key + "_" + headLineCondition.getEnableStatus();
		}
		//判断key是否存在
		if(!jedisKeys.exists(key)){
			//若不存在，则从数据库中获取数据
			headLineList = headLineDao.queryHeadLine(headLineCondition);
			//将对象转换为json字符串存储到redis中
			String jsonString;
			try {
				jsonString = mapper.writeValueAsString(headLineList);
			} catch (JsonProcessingException e) {//json处理异常
				e.printStackTrace();
				logger.error("json将头条对象转换为json字符串时，发生异常。");
				throw new HeadLineOperationException(e.getMessage());
			}
			//将转化后的字符串设置进redis中
			jedisStrings.set(key, jsonString);
		}
		//如果存在
		else{
			//从redis中根据key获取字符串
			String jsonString = jedisStrings.get(key);
			//获取要装换的类型
			JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, HeadLine.class);
			try {
				headLineList = mapper.readValue(jsonString, javaType);
			} catch (JsonProcessingException e) {
				e.printStackTrace();
				logger.error("从redis中获取的数据，使用jackson装换为Java对象异常");
				throw new HeadLineOperationException(e.getMessage());
			}
		}
		return headLineList;
	}
}
/**
 * ①定义将要存入redis中的key的前缀(作为final字段，定义在接口中)
 * ②定义接收头条列表的对象
 * ③定义jackson对象，对数据进行装换
 * ④拼接将要存入redis中的的key，头条列表分为禁用可用状态，使用key_0,key_1分开存储
 * ⑤先判断redis中是否存在key和对应的内容
 * ⑥如果不存在，直接从数据看中获取数据，并将对象数据庄换为json字符串，将key对应字符串存储到redis中
 * ⑦如果存在，则从redis中根据key取出对应的字符串，并通过定义需要转换的类型，将json字符串装换为对应的Java对象
 * ⑧返回数据
 * */
